# kind: Template

Конфигурация предназначена для реализации «шаблона» с описанием секций, которые будут промутированы (добавлены или изменены), важно сохранять yaml-структуру мутируемой конфигурации в рамках вашего шаблона. Мутация будет происходить, если в рамках «kind: Trigger» корректно дана ссылка на шаблон и условия для мутации (секция mutatingConfigs.match) выполнены в рамках ресурса, требующего мутации.

Перед началом реализации необходимо ознакомиться с ограничениями по мутации, которые описываются в рамках конфигурации «kind: Trigger». 

Убедитесь, что при мутировании ресурса (Pod, Service, ...) структура в рамках шаблона «kind: Template» соответствует вашему типу ресурсов. В случае, если не соответствует, то изменения при мутации могут привести к ошибке создания такого ресурса.

Мутация (полная перезапись объекта - replace или частичная перезапись объекта - merge) соответствует полю ["updateStrategy"](trigger.md#mutationconfigs) в шаблоне «kind: Trigger».

Пример конфигурации:

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: mutation-template
  namespace: template-namespace
spec:
  apiVersion: v1
  kind: Pod
  data: |-
    spec:
      containers:
        - resources:
            limits:
              cpu: '2'
              memory: 1Gi
            requests:
              cpu: 10m
              memory: 128Mi
          readinessProbe:
            failureThreshold: 30
            httpGet:
              path: /healthz/ready
              port: 15021
              scheme: HTTP
            initialDelaySeconds: 1
            periodSeconds: 2
            successThreshold: 1
            timeoutSeconds: 1
          terminationMessagePath: /dev/termination-log
          name: istio-proxy
          env:
            - name: ISTIO_META_DNS_CAPTURE
              value: 'true'
            - name: ISTIO_META_DNS_AUTO_ALLOCATE
              value: 'true'
          image: {URL_image}
```


| Поле          | Назначение                                |
|---------------|-------------------------------------------|
| kind          | Вид мутируемого ресурса в рамках кластера |
| [data](#data) | Описание полей ресурса для мутирования    |


## data

Это поле позволяет описать секции ресурса, которые будут мутированы. Есть возможность использовать goTemplate аналогично синтаксису в helm. 

Примеры:

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: mutation-template
  namespace: template-namespace
spec:
  kind: Pod
  apiVersion: v1
  data: |-  # секция для мутирования в рамках пользовательских Pod
    spec:
    containers:
      - resources:
        limits:
          cpu: '2'
          memory: 1Gi
        requests:
          cpu: 10m
          memory: 128Mi
        name: istio-proxy
```

Тогда после проведения мутции с помощью конфигурации выше: 

<table>
<tr>
<td> До </td> <td> После </td>
</tr>
<tr>
<td> 

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-mutation
  namespace: $NAMESPACE
spec:
  containers:
  - name: my-container
    image: nginx
    resources:
      limits:
        cpu: 500m
        memory: 128Mi
      requests:
        cpu: 250m
        memory: 64Mi
```

 </td>
<td>

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-mutation
  namespace: $NAMESPACE
spec:
  containers:
  - name: my-container
    image: nginx
    resources:
      limits:
        cpu: '2'
        memory: 1Gi
      requests:
        cpu: 10m
        memory: 128Mi
      name: istio-proxy
```

</td>
</tr>
</table>

Пример с использованием goTemplate:

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: mutation-template
  namespace: template-namespace
spec:
  apiVersion: v1
  kind: Deployment
  data: |-
    metadata:
      annotations: '{{% or (index .Spec.DataObj.metadata.annotation %}}'
```

Ниже приведен пример с использованием пользовательских параметров. В формуле вида ``` {{% or (index .Annotations "my-params/api-limits-cpu") "400m" %}} ``` первая часть конкретизирует, где искать пользовательские параметры в рамках из «kind: Deployment», а вторая часть отвечает за значение по умолчанию. 

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: mutation-template
  namespace: template-namespace
spec:
  apiVersion: v1
  kind: Pod
  data: |-
    spec:
      containers:
        - resources:
            limits:
              cpu: '{{% or (index .Annotations "my-params/api-limits-cpu") "400m" %}}'                        # параметр №1
              memory: '{{% or (index .Annotations "my-params/api-limits-memory") "600Mi" %}}'                 # параметр №2
            requests:
              cpu: '{{% or (index .Annotations "my-params/api-requests-cpu") "200m" %}}'                      # параметр №3
              memory: '{{% or (index .Annotations "my-params/api-requests-memory") "300Mi" %}}'               # параметр №4
          terminationMessagePath: /dev/termination-log
          name: istio-proxy
          env:
            - name: BLABLA
              value: '{{% or (index .Annotations "my-params/api-key") "NN" %}}'                               # параметр №5
          ports:
            - containerPort: {{% or (index .Annotations "my-params/api-port") 8080 %}}                        # параметр №6
              name: http2
              protocol: TCP
```